import pandas as pd
import re
from common_rules import DataRules

def extract_num_unit(value):
    """从字符串中提取数字和单位"""
    if pd.isna(value):
        return "", ""
    value_str = str(value).strip()
    # 正则表达式匹配数字部分和单位部分
    match = re.match(r'^([\d.]+)\s*([^\d\s]+)?$', value_str)
    if match:
        num_part = match.group(1)
        unit_part = match.group(2) if match.group(2) else ""
        return num_part, unit_part.strip()
    return value_str, ""

def process_data(df):
    """处理药品表格数据，应用所有规则并返回处理后的DataFrame"""
    # 添加检查结果列（记录指定的检查项）
    if '检查结果' not in df.columns:
        df.insert(len(df.columns), '检查结果', '')
    
    # 处理长数字字段为文本格式
    # 1. 条形码强制转换为文本（无论内容如何）
    if '条形码' in df.columns:
        # 强制转换为字符串并保留原始格式
        df['条形码'] = df['条形码'].astype(str)
        # 处理空值（NaN转换为空字符串）
        df['条形码'] = df['条形码'].replace('nan', '')
        # 移除可能的小数点和科学计数法表示
        df['条形码'] = df['条形码'].str.replace(r'\.0$', '', regex=True)
        scientific_mask = df['条形码'].str.contains(r'^[+-]?\d+\.?\d*[eE][+-]?\d+$', na=False)
        if scientific_mask.any():
            df.loc[scientific_mask, '条形码'] = df.loc[scientific_mask, '条形码'].apply(
                lambda x: f"{int(float(x)):d}" if '.' in x else f"{int(float(x)):d}"
            )
            df.loc[scientific_mask, '检查结果'] += '条形码已从科学计数法转换为文本; '
        # 检查空值并记录
        empty_mask = df['条形码'] == ''
        if empty_mask.any():
            df.loc[empty_mask, '检查结果'] += ''
    
    # 2. 其他长数字字段（仅对纯数字编码处理）
    long_number_fields = ['药品编码']  
    df = DataRules.convert_scientific_notation(df, long_number_fields)
    
    # 规则2: 厂家不能为空，为空填写'无'（记录）
    df = DataRules.fill_empty_manufacturer(df, field='厂家', fill_value='无')
    
    # 售价字段处理
    df = DataRules.validate_price_fields(df, fields=['总部售价', '门店售价'])
    
    # 规则4: 药品编码位数不能等于14（仅对纯数字编码检查）
    df = DataRules.validate_drug_code_length(df, field='药品编码', invalid_length=14)
    
    # 规则5: 药品名称前不能包含特殊字符*（记录）
    df = DataRules.clean_drug_name(df, field='药品')
    
    # 根据原始类型修改类型字段（模糊匹配版）
    if '原始类型' in df.columns and '类型' in df.columns:
        original_type = df['类型'].copy()
        result_col = '检查结果'
        
        # 定义模糊匹配规则（参考国药准字处理方式）
        mask_zhongyao = df['原始类型'].str.contains('中药', na=False)
        mask_sports = df['原始类型'].str.contains('普通及功能食品', na=False)
        mask_health = df['原始类型'].str.contains('国食保健食品', na=False)
        mask_medical = df['原始类型'].str.contains('医疗器械', na=False)
        mask_disinfect = df['原始类型'].str.contains('消毒及卫生用品', na=False)
        mask_cosmetic = df['原始类型'].str.contains('化妆品类', na=False)
        
        # 应用类型转换规则
        df.loc[mask_zhongyao & (df['类型'] != '中药'), '类型'] = '中药'
        df.loc[mask_sports & (df['类型'] != '其他商品'), '类型'] = '其他商品'
        df.loc[mask_health & (df['类型'] != '其他商品'), '类型'] = '其他商品'
        df.loc[mask_medical & (df['类型'] != '耗材'), '类型'] = '耗材'
        df.loc[mask_disinfect & (df['类型'] != '耗材'), '类型'] = '耗材'
        df.loc[mask_cosmetic & (df['类型'] != '其他商品'), '类型'] = '其他商品'
        
        # 记录类型变更
        changed_zhongyao = mask_zhongyao & (original_type != '中药')
        changed_sports = mask_sports & (original_type != '其他商品')
        changed_health = mask_health & (original_type != '其他商品')
        changed_medical = mask_medical & (original_type != '耗材')
        changed_disinfect = mask_disinfect & (original_type != '耗材')
        changed_cosmetic = mask_cosmetic & (original_type != '其他商品')
        
        # 更新检查结果
        df.loc[changed_zhongyao, result_col] += '原始类型包含"中药":类型设为中药; '
        df.loc[changed_sports, result_col] += '原始类型包含"普通及功能食品":类型设为其他商品; '
        df.loc[changed_health, result_col] += '原始类型包含"国食保健食品":类型设为其他商品; '
        df.loc[changed_medical, result_col] += '原始类型包含"医疗器械":类型设为耗材; '
        df.loc[changed_disinfect, result_col] += '原始类型包含"消毒及卫生用品":类型设为耗材; '
        df.loc[changed_cosmetic, result_col] += '原始类型包含"化妆品类":类型设为其他商品; '
    
    # 拆零单位检查（记录）
    df = DataRules.check_split_unit(df, qty_field='拆零数量', unit_field='单位', split_unit_field='拆零单位')

    # 国药准字类型处理（记录）
    df = DataRules.process_approval_number(df, approval_field='国药准字', type_field='类型')
    
    # 日期格式化处理
    df = DataRules.format_date_fields(df, fields=["最近生产日期", "最近效期"])
    
    # 清理检查结果
    df['检查结果'] = df['检查结果'].str.strip('; ').str.replace(';;', ';')
    return df